package tool

import (
	"encoding/json"
	"os"
)

type Config struct {
	AppName   string `json:"app_name"`
	AppMode   string `json:"app_mode"`
	AppHost   string `json:"app_host"`
	AppPort   int    `json:"app_port"`
	ServerUrl string `json:"server_url"`

	Sms      SmsConfig      `json:"sms"`
	Database DatabaseConfig `json:"database"`
	Redis    RedisConfig    `json:"redis"`
	Fdfs     FdfsConfig     `json:"fdfs"`
}

type SmsConfig struct {
	SignName     string `json:"sign_name"`
	TemplateCode string `json:"template_code"`
	AppKey       string `json:"app_key"`
	AppSecret    string `json:"app_secret"`
	RegionId     string `json:"region_id"`
}

type DatabaseConfig struct {
	Driver   string `json:"driver"`
	User     string `json:"user"`
	Password string `json:"password"`
	Host     string `json:"host"`
	Port     string `json:"port"`
	DbName   string `json:"db_name"`
	Charset  string `json:"charset"`
	ShowSql  bool   `json:"show_sql"`
}

type RedisConfig struct {
	Host     string `json:"host"`
	Port     string `json:"port"`
	Password string `json:"password"`
	Db       int    `json:"db"`
}

type FdfsConfig struct {
	ServerUrl string `json:"server_url"`
}

var cfg = new(Config)

func GetConfig() *Config {
	return cfg
}

func ParseConfig(filepath string) (*Config, error) {
	fp, err := os.Open(filepath)
	if err != nil {
		panic(err)
	}
	defer fp.Close()

	decoder := json.NewDecoder(fp)
	if err := decoder.Decode(&cfg); err != nil {
		return nil, err
	}
	return cfg, nil
}

func FileServerAddr() string {
	return cfg.Fdfs.ServerUrl
}
